#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e4+10,INF=0x7fffffff;
int n,head[MAXN],cnt,root,sum,sumch[MAXN],f[MAXN],t[3],d[MAXN],ans;
bool vis[MAXN];
struct edge
{
	int v,next,val;
}e[MAXN*2];
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
void addedge(int x,int y,int z)
{
	e[++cnt]=(edge){y,head[x],z};
	head[x]=cnt;
	return;
}
void getroot(int u,int fa)
{
	sumch[u]=1;
	f[u]=0;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(vis[v]||v==fa)continue;
		getroot(v,u);
		sumch[u]+=sumch[v];
		f[u]=max(f[u],sumch[v]);
	}
	f[u]=max(f[u],sum-sumch[u]);
	if(f[u]<f[root])root=u;
	return;
}
void getdep(int u,int fa)
{
	++t[d[u]];
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==fa||vis[v])continue;
		d[v]=(d[u]+e[i].val)%3;
		getdep(v,u);
	}
	return;
}
int cal(int u,int x)
{
	t[0]=t[1]=t[2]=0;
	d[u]=x%3;
	getdep(u,0);
	return t[1]*t[2]*2+t[0]*t[0];
}
void solve(int u)
{
	ans+=cal(u,0);
	vis[u]=true;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(vis[v])continue;
		ans-=cal(v,e[i].val);
		root=0;
		sum=sumch[v];
		getroot(v,0);
		solve(root);
	}
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;++i)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		addedge(x,y,z);
		addedge(y,x,z);
	}
	sum=n;
	f[0]=INF;
	getroot(1,0);
	solve(root);
	int k=gcd(ans,n*n);
	printf("%d/%d\n",ans/k,n*n/k);
	return 0;
}
